# Importo modulo necesario para parsear archivos .xml
from xml.dom.minidom import parse

from util import *

class xml_parser():
    
    def __init__(self, file_name):
        self.name = file_name
        # Cargo archivo a parsear
        self.config_file = parse(file_name)
    
    def get_amplitud_atractiva(self):
        
        # Obtengo elemento deseado
        elemento = self.config_file.getElementsByTagName('amplitud_atractiva')
        
        # Extraigo valor
        valor = elemento[0].childNodes[0].nodeValue
        
        # Devuelvo valor
        return float(valor)
    
    def get_amplitud_repulsiva(self):
        
        # Obtengo elemento deseado
        elemento = self.config_file.getElementsByTagName('amplitud_repulsiva')
        
        # Extraigo valor
        valor = elemento[0].childNodes[0].nodeValue
        return float(valor)
    
    def get_rango_de_atraccion(self):
        
        # Obtengo elemento deseado
        elemento = self.config_file.getElementsByTagName('rango_de_atraccion')
        
        # Extraigo valor
        valor = elemento[0].childNodes[0].nodeValue
        
        # Devuelvo valor
        return float(valor)
    
    def get_rango_de_repulsion(self):
        
        # Obtengo elemento deseado
        elemento = self.config_file.getElementsByTagName('rango_de_repulsion')
        
        # Extraigo valor
        valor = elemento[0].childNodes[0].nodeValue
        
        # Devuelvo valor
        return float(valor)
    
    def get_alpha(self):
        
        # Obtengo elemento deseado
        elemento = self.config_file.getElementsByTagName('alpha')
        
        # Extraigo valor
        valor = elemento[0].childNodes[0].nodeValue
        
        # Devuelvo valor
        return float(valor)
    
    def get_beta(self):
        
        # Obtengo elemento deseado
        elemento = self.config_file.getElementsByTagName('beta')
        
        # Extraigo valor
        valor = elemento[0].childNodes[0].nodeValue
        
        # Devuelvo valor
        return float(valor)
    
    def get_kinetic_range(self):
        
        # Obtengo elemento deseado
        elemento = self.config_file.getElementsByTagName('kinetic_range')
        
        # Extraigo valor
        valor = elemento[0].childNodes[0].nodeValue
        
        # Devuelvo valor
        return float(valor)
    
    def get_cantidad_agentes(self):
        
        # Obtengo elemento deseado
        elemento = self.config_file.getElementsByTagName('cantidad_agentes')
        
        # Extraigo valor
        valor = elemento[0].childNodes[0].nodeValue
        
        # Devuelvo valor
        return int(valor)
    
    def get_vis_range(self):
        
        # Obtengo elemento deseado
        elemento = self.config_file.getElementsByTagName('range')
        
        # Extraigo valor
        valor = elemento[0].childNodes[0].nodeValue
        
        # Devuelvo valor
        return float(valor)

    def get_vis_amplitude(self):
        
        # Obtengo elemento deseado
        elemento = self.config_file.getElementsByTagName('amplitude')
        
        # Extraigo valor
        valor = elemento[0].childNodes[0].nodeValue
        
        # Devuelvo valor
        return float(valor)

    def get_vis_resolution(self):
        
        # Obtengo elemento deseado
        elemento = self.config_file.getElementsByTagName('resolution')
        
        # Extraigo valor
        valor = elemento[0].childNodes[0].nodeValue
        
        # Devuelvo valor
        return float(valor)
    
    def get_vis_epsilon(self):
        
        # Obtengo elemento deseado
        elemento = self.config_file.getElementsByTagName('epsilon')
        
        # Extraigo valor
        valor = elemento[0].childNodes[0].nodeValue
        
        # Devuelvo valor
        return float(valor)
    
    def get_masa_agente(self):
        
        # Obtengo elemento deseado
        elemento = self.config_file.getElementsByTagName('masa')
        
        # Extraigo valor
        valor = elemento[0].childNodes[0].nodeValue
        
        # Devuelvo valor
        return float(valor)
    
    def get_simulation_time(self):
        
        # Obtengo elemento deseado
        elemento = self.config_file.getElementsByTagName('simulation_time')
        
        # Extraigo valor
        valor = elemento[0].childNodes[0].nodeValue
        
        # Devuelvo valor
        return int(valor)
    
    def get_position(self, agent_number):
        
        # Obtengo elemento deseado
        elemento = self.config_file.getElementsByTagName('data')
        
        # Si tengo valores iniciales para el agente numero 'agent_number'
        if len(elemento) > agent_number:
            
            # Extraigo valor
            agent_data = elemento[agent_number]
            
            # Recupero la posicion para la coordenada X e Y
            pos_x = agent_data.getElementsByTagName('x_pos')
            pos_y = agent_data.getElementsByTagName('y_pos')
            
            # Extraigo valor de coordenadas X e Y
            x = pos_x[0].childNodes[0].nodeValue
            y = pos_y[0].childNodes[0].nodeValue
        
        # Si no tengo una posicion inicial para el agente 'agent_number'
        else:
            
            # Genero una posicion inicial random
            x, y = rand_position_on_circle(5)
        
        # Devuelvo coordenadas de la posicion del agente 'agent_number'
        return (float(x), float(y))
    
    def get_is_random(self):
        
        # Obtengo elemento deseado
        elemento = self.config_file.getElementsByTagName('random_position')
        
        # Extraigo valor
        valor = elemento[0].childNodes[0].nodeValue
        
        # Devuelvo valor
        return valor == 'True'
    
    def get_vis_is_visible_cone(self):
        
        # Obtengo elemento deseado
        elemento = self.config_file.getElementsByTagName('visible_cone')
        
        # Extraigo valor
        valor = elemento[0].childNodes[0].nodeValue
        
        # Devuelvo valor
        return valor == 'True'
    
    def get_vis_is_enable(self):
        
        # Obtengo elemento deseado
        elemento = self.config_file.getElementsByTagName('vis_enable')
        
        # Extraigo valor
        valor = elemento[0].childNodes[0].nodeValue
        
        # Devuelvo valor
        return valor == 'True'
    
    def get_is_grafic(self):
        
        # Obtengo elemento deseado
        elemento = self.config_file.getElementsByTagName('grafics')
        
        # Extraigo valor
        valor = elemento[0].childNodes[0].nodeValue
        
        # Devuelvo valor
        return valor == 'True'
    
    def get_screen_size(self):
        
        # Obtengo elemento deseado
        win_element = self.config_file.getElementsByTagName('window')
        
        # Extraigo ancho de pantalla y alto
        width = win_element[0].attributes['width'].value
        height = win_element[0].attributes['height'].value
        
        # Devuelvo tamanio de pantalla
        return int(width), int(height)
    
    def get_screen_name(self):
        
        # Obtengo elemento deseado
        win_element = self.config_file.getElementsByTagName('window')
        
        # Extraigo valor
        valor = win_element[0].attributes['name'].value
        
        # Devuelvo valor
        return valor
    
    def get_imagen(self):
        
        # Obtengo elemento deseado
        elemento = self.config_file.getElementsByTagName('imagen')
        
        # Extraigo valor
        valor = elemento[0].childNodes[0].nodeValue
        
        # Devuelvo valor
        return valor
    
    def get_fps(self):
        
        # Obtengo elemento deseado
        elemento = self.config_file.getElementsByTagName('fps')
        
        # Extraigo valor
        valor = elemento[0].childNodes[0].nodeValue
        
        # Devuelvo valor
        return int(valor)
    
    def get_dt(self):
        
        # Obtengo elemento deseado
        elemento = self.config_file.getElementsByTagName('dt')
        
        # Extraigo valor
        valor = elemento[0].childNodes[0].nodeValue
        
        # Devuelvo valor
        return float(valor)
